
// === uuMeta.type ===
// depend: uuMeta
/*
uuMeta.type(mix, match = 0x0) - return bool or matched bits
uuMeta.type.TYPES
uuMeta.type.NULL
uuMeta.type.UNDEF
uuMeta.type.HASH
uuMeta.type.ARRAY
uuMeta.type.BOOL
uuMeta.type.NUM
uuMeta.type.STR
uuMeta.type.FUNC
uuMeta.type.NODE
uuMeta.type.FAKE
 */
(function uuMetaTypeScope() {
var _type, // inner namespace
    _win = window,
    _doc = document;

// uuType - type detection
function type(mix,     // @param Mix:
              match) { // @param Number(= 0x0): match types
                       // @return Boolean/Number: true = match,
                       //                         false = unmatch
                       //                         number is matched bits
  // IE6 mem-leaks: (document instanceof Array),
  //                (window instanceof Array) is leaks
  var undf,
      rv = (mix === null) ? _type.NULL
         : (mix === undf) ? _type.UNDEF
         : (mix === _win) ? _type.HASH // fix IE6 mem-leaks
         : (mix === _doc) ? _type.HASH // fix IE6 mem-leaks
         : (mix instanceof Array) ? _type.ARRAY
         : (_type.TYPES[typeof mix] || _type.HASH);

  if (rv === _type.HASH) {
    rv = mix.nodeType ? _type.NODE
                      : ("length" in mix) ? _type.FAKE
                                          : _type.HASH;
  }
  return match ? match & rv : rv;
}

// uuMeta.type.TYPES
type.TYPES = { // typeof hash
  "boolean":  0x010,
  "number":   0x020,
  "string":   0x040,
  "function": 0x080
};

// uuMeta.type.NULL
type.NULL = 0x001; // null

// uuMeta.type.UNDEF
type.UNDEF = 0x002; // undefined

// uuMeta.type.HASH
type.HASH = 0x004; // Hash / Object / window / document

// uuMeta.type.ARRAY
type.ARRAY = 0x008; // Array

// uuMeta.type.BOOL
type.BOOL = 0x010; // Boolean

// uuMeta.type.NUM
type.NUM = 0x020; // Number

// uuMeta.type.STR
type.STR = 0x040; // String

// uuMeta.type.FUNC
type.FUNC = 0x080; // Function

// uuMeta.type.NODE
type.NODE = 0x100;

// uuMeta.type.FAKE
type.FAKE = 0x200; // FakeArray // "length" has collection (eg: NodeList)

// --- initialize ---

// --- export ---
uuMeta.type = type;

})(); // uuMeta.type scope

